'use strict'

var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'),
  InputOutputHelper = require('../../../helper/InputOutputHelper')

var utils = require('../../../Utils'),
  escapeHTML = utils.escapeHTML,
  triggerClickEvent = utils.triggerClickEvent

var implementationType = require('./implementation/ImplementationType'),
  delegate = require('./implementation/Delegate'),
  external = require('./implementation/External'),
  callable = require('./implementation/Callable'),
  resultVariable = require('./implementation/ResultVariable')

var entryFactory = require('../../../factory/EntryFactory')

var domQuery = require('min-dom').query,
  domClosest = require('min-dom').closest,
  domClasses = require('min-dom').classes

function getImplementationType(element) {
  return ImplementationTypeHelper.getImplementationType(element)
}

function getBusinessObject(element) {
  return ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element)
}

function isDmnCapable(element) {
  return ImplementationTypeHelper.isDmnCapable(element)
}

function isExternalCapable(element) {
  return ImplementationTypeHelper.isExternalCapable(element)
}

function isServiceTaskLike(element) {
  return ImplementationTypeHelper.isServiceTaskLike(element)
}

module.exports = function(group, element, bpmnFactory, translate) {
  if (!isServiceTaskLike(getBusinessObject(element))) {
    return
  }

  var hasDmnSupport = isDmnCapable(element)
  var hasExternalSupport = isExternalCapable(getBusinessObject(element))

  // implementation type ////////////////////////////////////

  group.entries = group.entries.concat(implementationType(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType,
    hasDmnSupport: hasDmnSupport,
    hasExternalSupport: hasExternalSupport,
    hasServiceTaskLikeSupport: true
  }, translate))

  // delegate (class, expression, delegateExpression) //////////

  group.entries = group.entries.concat(delegate(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType
  }, translate))

  // result variable /////////////////////////////////////////

  group.entries = group.entries.concat(resultVariable(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType,
    hideResultVariable: function(element, node) {
      return getImplementationType(element) !== 'expression'
    }
  }, translate))

  // external //////////////////////////////////////////////////

  if (hasExternalSupport) {
    group.entries = group.entries.concat(external(element, bpmnFactory, {
      getBusinessObject: getBusinessObject,
      getImplementationType: getImplementationType
    }, translate))
  }

  // dmn ////////////////////////////////////////////////////////

  if (hasDmnSupport) {
    group.entries = group.entries.concat(callable(element, bpmnFactory, {
      getCallableType: getImplementationType
    }, translate))
  }

  // connector ////////////////////////////////////////////////

  var isConnector = function(element) {
    return getImplementationType(element) === 'connector'
  }

  group.entries.push(entryFactory.link({
    id: 'configureConnectorLink',
    label: translate('Configure Connector'),
    handleClick: function(element, node, event) {
      var connectorTabEl = getTabNode(node, 'connector')

      if (connectorTabEl) {
        triggerClickEvent(connectorTabEl)
      }

      // suppress actual link click
      return false
    },
    showLink: function(element, node) {
      var link = domQuery('a', node)
      link.textContent = ''

      domClasses(link).remove('bpp-error-message')

      if (isConnector(element)) {
        var connectorId = InputOutputHelper.getConnector(element).get('connectorId')
        if (connectorId) {
          link.textContent = translate('Configure Connector')
        } else {
          link.innerHTML = '<span class="bpp-icon-warning"></span> ' + escapeHTML(translate('Must configure Connector'))
          domClasses(link).add('bpp-error-message')
        }

        return true
      }

      return false
    }
  }))
}

// helpers ///////////////////////////

function getTabNode(el, id) {
  var containerEl = domClosest(el, '.bpp-properties-panel')

  return domQuery('a[data-tab-target="' + id + '"]', containerEl)
}
